package com.ryder.petmatediarybackend.common.config.web;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * 描述: Knife4j OpenAPI 3 配置
 *
 * @author Ryder
 * @version 1.0
 * @since 1.0
 * 更新日期: 2025/10/26
 */
@Configuration
public class Knife4jConfig {

    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("PetMateDiary API 文档")
                        .description("伴宠日记后端服务接口文档")
                        .version("v1.0.0")
                        .contact(new Contact()
                                .name("Ryder")
                                .email("ryder@example.com")
                                .url("https://github.com/ryder"))
                        .license(new License()
                                .name("Apache 2.0")
                                .url("https://www.apache.org/licenses/LICENSE-2.0.html")))
                .servers(List.of(
                        new Server()
                                .url("http://localhost:3099/ryder")
                                .description("开发环境")
                ))
                .externalDocs(new ExternalDocumentation()
                        .description("Knife4j 官方文档")
                        .url("https://doc.xiaominfo.com/"))
                // 配置安全认证（使用 APIKEY 类型，手动控制 Token 格式）
                .components(new Components()
                        .addSecuritySchemes("Authorization", new SecurityScheme()
                                .type(SecurityScheme.Type.APIKEY)
                                .in(SecurityScheme.In.HEADER)
                                .name("Authorization")
                                .description("访问令牌认证\n\n" +
                                        "格式：ryder {accessToken}\n" +
                                        "示例：ryder BkC09M5B9EtEwb268Sxydo8hbWueOwyQ\n\n" +
                                        "注意：必须包含 'ryder ' 前缀和空格")))
                // 全局应用安全认证
                .addSecurityItem(new SecurityRequirement().addList("Authorization"));
    }

    /**
     * 全部接口分组
     */
    @Bean
    public GroupedOpenApi allApi() {
        return GroupedOpenApi.builder()
                .group("全部接口")
                .pathsToMatch("/**")
                .build();
    }

    /**
     * 测试模块分组
     */
    @Bean
    public GroupedOpenApi testApi() {
        return GroupedOpenApi.builder()
                .group("测试模块")
                .pathsToMatch("/test/**")
                .build();
    }

    /**
     * 认证模块分组
     */
    @Bean
    public GroupedOpenApi authApi() {
        return GroupedOpenApi.builder()
                .group("认证模块")
                .pathsToMatch("/auth/**")
                .build();
    }

    /**
     * 角色管理分组
     */
    @Bean
    public GroupedOpenApi roleApi() {
        return GroupedOpenApi.builder()
                .group("角色管理")
                .pathsToMatch("/admin/role/**")
                .build();
    }

    /**
     * 定时任务管理分组
     */
    @Bean
    public GroupedOpenApi taskApi() {
        return GroupedOpenApi.builder()
                .group("定时任务管理")
                .pathsToMatch("/admin/task/**")
                .build();
    }

    /**
     * 文件上传管理分组
     */
    @Bean
    public GroupedOpenApi fileApi() {
        return GroupedOpenApi.builder()
                .group("文件上传管理")
                .pathsToMatch("/upload/**")
                .build();
    }
}
